﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Autocentro.Entities;
using Autocentro.BussinesLogic;
using Microsoft.Practices.Unity;

namespace Autocentro.UI
{
    public partial class FrmMttVenta : Form
    {
        [Dependency]
        public IVentaBL VentaBL { get; set; }

        [Dependency]
        public IProductoBL ProductoBL { get; set; }
        
        [Dependency]
        public IClienteBL ClienteBL { get; set; }
        
        [Dependency]
        public IDetalleVentaBL DetalleVentaBL { get; set; }

        public FrmMttVenta()
        {
            InitializeComponent();
            this.BuildUp();
        }

        private void FrmMttVenta_Load(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;
            lblNewProducto.Visible = false;
            pRODUCTOBindingSource.DataSource = ProductoBL.GetAllFromSoloProductos("");
        }

        bool IsNew = true;

        public void AddVenta()
        {
            vENTABindingSource.AddNew();
        }

        public void Editar(int id)
        {
            IsNew = false;
            var venta = VentaBL.GetFromVentaById(id);
            venta.Cliente = ClienteBL.GetFromClienteByID(venta.IdCliente);
            vENTABindingSource.DataSource = venta;

            lblAyuda.Visible = false;
        }

        private void ruc_DNITextBox_TextChanged(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void ruc_DNITextBox_Leave(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;

            VerificarCliente();
        }

        private void ruc_DNITextBox_Click(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void ruc_DNITextBox_KeyDown(object sender, KeyEventArgs e)
        {
            #region LoadCliente
            if (e.KeyCode == Keys.Enter)
            {
                VerificarCliente();
            }
            #endregion

            #region BuscarCliente

            if (e.KeyCode == Keys.F1)
            {
                FrmCliente frm = new FrmCliente();
                frm.Clien = true;
                frm.ShowDialog();
                if (frm.CurrentCliente != null)
                {
                    var venta = vENTABindingSource.Current as VENTA;
                    venta.Cliente = frm.CurrentCliente;
                    venta.IdCliente = frm.CurrentCliente.Id;
                    vENTABindingSource.ResetBindings(true);
                }

            }
            #endregion

        }

        private void ruc_DNITextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
            }
        }

        private void btnVerificarCliente_Click(object sender, EventArgs e)
        {
            VerificarCliente();
        }

        private void VerificarCliente()
        {
            var _venta = vENTABindingSource.Current as VENTA;

            if (ruc_DNITextBox.Text.Length == 0)
            {
                MessageBox.Show("Ingrese el número de RUC/DNI", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else if ((ruc_DNITextBox.Text).Length == 8 || (ruc_DNITextBox.Text).Length == 11)
            {
                var cliente = ClienteBL.GetFromClienteByRucDni(ruc_DNITextBox.Text);
                if (cliente != null)
                {
                    _venta.Cliente = cliente;
                    _venta.IdCliente = cliente.Id;
                    vENTABindingSource.ResetBindings(true);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("Cliente no Existe ¿Desea crearlo?"),
                        "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        var addCliente = new FrmMttoCliente();
                        addCliente.AddClienteVenta(ruc_DNITextBox.Text);
                        addCliente.ShowDialog();
                        VerificarCliente();
                    }
                }
            }
            else
            {
                MessageBox.Show("Longitud de RUC/DNI incorrecta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                _venta.Cliente = null;
                _venta.IdCliente = 0;
                vENTABindingSource.ResetBindings(true);
            }
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                CargaProductos();
            }
        }

        private void CargaProductos()
        {
            List<PRODUCTO> existenProductos;

            var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;

            existenProductos = ProductoBL.GetAllFromSoloProductos(criterio);
            pRODUCTOBindingSource.DataSource = ProductoBL.GetAllFromSoloProductos(criterio);

            if (existenProductos.Count <= 0)
            {
                lblNewProducto.Visible = true;
            }
            else
            {
                lblNewProducto.Visible = false;
            }
            

        }

        private void pRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.pRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                AgregarProducto();
            }
        }

        private void pRODUCTODataGridView_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            AgregarProducto();
        }

        private void pRODUCTODataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            AgregarProducto();
        }

        private void AgregarProducto()
        {
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var currentVenta = vENTABindingSource.Current as VENTA;

            if (producto != null && producto.Stock > 0)
            {
                var detalle = new DETALLEVENTA
                {
                    IdVenta = currentVenta.Id,
                    IdProducto = producto.Id,
                    Producto = producto,
                    Cantidad = 1,
                    
                };
                var existe = currentVenta.DetalleVenta.Where(dv => dv.Producto.Id.Equals(producto.Id)).SingleOrDefault();

                if (existe == null)
                {
                    currentVenta.DetalleVenta.Add(detalle);
                    currentVenta.Total = currentVenta.DetalleVenta.Sum(dv => dv.Monto);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El producto: {0}," +
                        "ya se encuentra en le pedido desea agregra otro?", producto.Descripcion),
                    "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        
                        if (existe.Cantidad + 1 <= producto.Stock)
                        {
                            existe.Cantidad++;
                            currentVenta.Total = currentVenta.DetalleVenta.Sum(dv => dv.Monto);
                            CalcularTotal();
                        }
                        else
                        {
                            MessageBox.Show("La cantidad supera el stock disponible.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                }
                vENTABindingSource.ResetBindings(true);
                detalleVentaBindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show("La cantidad supera el stock disponible.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void CalcularTotal()
        {
            var venta = vENTABindingSource.Current as VENTA;
            if (venta!=null)
            {
                venta.Total = venta.DetalleVenta.Sum(dv=>dv.Monto);
                vENTABindingSource.ResetBindings(true);
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            QuitarProducto(); 
        }

        private void QuitarProducto()
        {
            var ventaC = vENTABindingSource.Current as VENTA;
            var DetalleVe = detalleVentaBindingSource.Current as DETALLEVENTA;
            if (ventaC != null)
            {
                var rpt = MessageBox.Show(this,string.Format("El producto: {0}," +"ya se encuentra en le pedido desea Quitar?",
                       DetalleVe.Producto.Descripcion),"Quitar Producto",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    if (DetalleVe.IdProducto>0)
                    {
                        DetalleVentaBL.DeleteDetalleVenta(DetalleVe.Item,ventaC.Id);
                    }
                    detalleVentaBindingSource.RemoveCurrent();
                    CalcularTotal();
                    vENTABindingSource.ResetBindings(true);
                    detalleVentaBindingSource.ResetBindings(true);
                }
                
            }
            else
            {
                MessageBox.Show("Debe seleccionar un producto del detalle");
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            CargaProductos();
        }
        
        private void detalleVentaDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1 || e.ColumnIndex == 2 || e.ColumnIndex == 3)  
            {
                var producto = new PRODUCTO();
                var detalle = detalleVentaBindingSource.Current as DETALLEVENTA;

                if (detalle != null)
                {
                    producto = ProductoBL.GetFromProductoByID(detalle.Producto.Id);
                    if (detalle.Cantidad <= 0)
                    {
                        MessageBox.Show("La cantidad debe ser mayor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        detalle.Cantidad = 1;
                    }
                    else
                    {
                        if (detalle.Cantidad > producto.Stock)
                        {
                            MessageBox.Show("La cantidad supera el stock disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            detalle.Cantidad = producto.Stock;
                        }
                    }
                    CalcularTotal();
                }
            }
                   
        }

        private void detalleVentaDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.detalleVentaDataGridView.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                QuitarProducto();
            }
        }

        private void detalleVentaDataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            QuitarProducto();
        }

        private void detalleVentaDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Asegurese de ingresar un valor correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void detalleVentaDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                QuitarProducto();
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var venta = vENTABindingSource.Current as VENTA;
            var msg = "ERROR";
            if (venta != null)
            {
                if (IsNew)
                {
                    try
                    {
                        VentaBL.AddVenta(venta);
                        IsNew = false;
                        MessageBox.Show("Registro Correcto", "Mensaje",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message; MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    try
                    {
                        VentaBL.UpdateVenta(venta);
                        Editar(venta.Id);
                        MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message; MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
        }

        private void TxtProductoDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProductoEnDetalle();
            }
        }

        private void btnBuscarDetalle_Click(object sender, EventArgs e)
        {
            BuscarProductoEnDetalle();
        }

        private void BuscarProductoEnDetalle()
        {

            List<DETALLEVENTA> listatemp = new List<DETALLEVENTA>();
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var _venta = vENTABindingSource.Current as VENTA;

            if (_venta != null)
            {
                if (TxtProductoDesc.Text != null && TxtProductoDesc.Text != "" && TxtProductoDesc.Text != string.Empty)
                {
                    foreach (var item in _venta.DetalleVenta)
                    {
                        var descMayus = (TxtProductoDesc.Text).ToUpper();
                        var itemPRO = (item.Producto.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                    detalleVentaBindingSource.DataSource = listatemp;
                    detalleVentaBindingSource.ResetBindings(true);
                }
                else
                {
                    detalleVentaBindingSource.DataSource = _venta.DetalleVenta;
                    detalleVentaBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen productos en el detalle", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void txtCriterio_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void TxtProductoDesc_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void ruc_DNITextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        
        
    }
}
